#include "head.h"
bool AddPolyn(LinkList pLink1, LinkList pLink2)//将两个多项式相加
{
	LinkList pLinkList=(LinkList)malloc(sizeof(LPolyn));
	Link L1 = (Link)malloc(sizeof(LNode));
	Link LNodeList = (Link)malloc(sizeof(LNode));
	pLinkList->head = LNodeList;								//表头指向空结点
	pLinkList->tail = LNodeList;									//表末也指向空结点
	LNodeList->data.coef = 0;							//初始化空结点
	LNodeList->data.expn = -1;
	LNodeList->next = NULL;
	pLinkList->len = 0;
	L1 = pLink1->head->next;
	ElemType ele;						//声明元素函数
	for (int i = 0; i < pLink1->len-1; i++)
	{
		ele = L1->data;
		InsertLNode(pLinkList, ele);
		pLinkList->len++;
		L1 = L1->next;
	}
	ele = L1->data;
	InsertLNode(pLinkList, ele);
	L1 = pLink2->head->next;
	for (int i = 0; i < pLink2->len-1; i++)
	{
		ele = L1->data;
		InsertLNode(pLinkList, ele);
		pLinkList->len++;
		L1 = L1->next;
	}
	ele = L1->data;
	InsertLNode(pLinkList, ele);
	cout << "\n  则两个多项式相加的结果为：     ";
	PrintPolyn(pLinkList);
	DestroyPolyn(pLinkList);
	free(pLinkList);
	return EXIT_SUCCESS;
}
bool DecPolyn(LinkList pLink1, LinkList pLink2)//将两个多项式相减
{
	LinkList pLinkList = (LinkList)malloc(sizeof(LPolyn));
	Link L2 = (Link)malloc(sizeof(LNode));
	Link LNodeList = (Link)malloc(sizeof(LNode));		//为第一个空结点分配内存
	pLinkList->head = LNodeList;								//表头指向空结点
	pLinkList->tail = LNodeList;									//表末也指向空结点
	LNodeList->data.coef = 0;							//初始化空结点
	LNodeList->data.expn = -1;
	LNodeList->next = NULL;
	pLinkList->len = 0;
	L2 = pLink1->head->next;
	ElemType ele;						//声明元素函数
	for (int i = 0; i < pLink1->len - 1; i++)
	{
		ele = L2->data;
		InsertLNode(pLinkList, ele);
		pLinkList->len++;
		L2=L2->next;
	}
	ele = L2->data;
	InsertLNode(pLinkList, ele);
	L2 = pLink2->head->next;
	for (int i = 0; i < pLink2->len - 1; i++)
	{
		ele = L2->data;
		Insert_LNode(pLinkList, ele);
		pLinkList->len++;
		L2=L2->next;
	}
	ele = L2->data;
	Insert_LNode(pLinkList, ele);
	cout << "\n  则两个多项式相加的结果为：     ";
	PrintPolyn(pLinkList);
	DestroyPolyn(pLinkList);
	free(pLinkList);
	return EXIT_SUCCESS;
}
bool InsertLNode(LinkList pLink, ElemType e)	//将某一项的数据按从小到大的顺序定位插入到已存在的多项式表中 可合并同类项并删除系数为0的项
{
	Link p = pLink->head;						//定义指向结点的指针以定位
	Link ins = (Link)malloc(sizeof(LNode));		//为插入项分配内存
	if (!ins) { cout << "ERROR!"; }				//检测创建是否成功
	ins->data = e;								//为插入项添加项的数据：系数 指数
	if (p->next == NULL)
	{											//当该多项式无项数时
		p->next = ins;
		ins->next = NULL;
		pLink->tail = ins;
		return EXIT_SUCCESS;
	}
	while (p->next->data.expn < e.expn)		//定位到不比添加数据项的指数 小的项数结点的前一个结点
	{
		if (p->next->next == NULL)				//如果已经到结点末端 直接插入 无须排序  跳出循环避免结点继续后移
			break;
		p = p->next;							//指向下一个结点
	}
	if (e.expn == p->next->data.expn)			//如果为同类项
	{
		p->next->data.coef += e.coef;			//合并同类项后返回
		if (p->next->data.coef == 0)			//若合并后系数为0
		{
			Delete_Next_Node(p, pLink);			//删除该结点并返回
		}
		return EXIT_SUCCESS;
	}
	if (p->next->next == NULL)					//已移动到结点末端 为最大项 则直接添加并更改多项式表末结点
	{
		p->next->next = ins;
		ins->next = NULL;
		pLink->tail = ins;
		return EXIT_SUCCESS;
	}
	else										//定位成功 不是指数最大项  正常插入结点
	{
		ins->next = p->next;
		p->next = ins;
		return EXIT_SUCCESS;
	}
	return EXIT_FAILURE;
}
bool Insert_LNode(LinkList pLink, ElemType e)	//将某一项的数据按从小到大的顺序定位插入到已存在的多项式表中 可合并同类项并删除系数为0的项
{
	Link p = pLink->head;						//定义指向结点的指针以定位
	Link ins = (Link)malloc(sizeof(LNode));		//为插入项分配内存
	if (!ins) { cout << "ERROR!"; }				//检测创建是否成功
	e.coef = -e.coef;
	ins->data = e;								//为插入项添加项的数据：系数 指数
	if (p->next == NULL)
	{											//当该多项式无项数时
		p->next = ins;
		ins->next = NULL;
		pLink->tail = ins;
		return EXIT_SUCCESS;
	}
	while (p->next->data.expn < e.expn)		//定位到不比添加数据项的指数 小的项数结点的前一个结点
	{
		if (p->next->next == NULL)				//如果已经到结点末端 直接插入 无须排序  跳出循环避免结点继续后移
			break;
		p = p->next;							//指向下一个结点
	}
	if (e.expn == p->next->data.expn)			//如果为同类项
	{
		p->next->data.coef += e.coef;			//合并同类项后返回
		if (p->next->data.coef == 0)			//若合并后系数为0
		{
			Delete_Next_Node(p, pLink);			//删除该结点并返回
		}
		return EXIT_SUCCESS;
	}
	if (p->next->next == NULL)					//已移动到结点末端 为最大项 则直接添加并更改多项式表末结点
	{
		p->next->next = ins;
		ins->next = NULL;
		pLink->tail = ins;
		return EXIT_SUCCESS;
	}
	else										//定位成功 不是指数最大项  正常插入结点
	{
		ins->next = p->next;
		p->next = ins;
		return EXIT_SUCCESS;
	}
	return EXIT_FAILURE;
}
bool Delete_Next_Node(Link LinkNode, LinkList pLink)//删除当前节点的下一个节点中的项
{
	Link L = LinkNode;//定结点指针
	L = LinkNode->next;//指向需要删除的结点
	if (LinkNode->next->next == NULL)//如果删除的结点为末结点
	{
		LinkNode->next = NULL;
		pLink->tail = LinkNode;				//更改末结点位置
		free(L);							//释放删除的结点
		return EXIT_SUCCESS;
	}
	LinkNode->next = LinkNode->next->next;		//跳过该结点 链接到下一个节点
	free(L);								//释放删除的结点
	return EXIT_SUCCESS;
}